﻿Imports GMap.NET
Imports GMap.NET.WindowsForms
Imports GMap.NET.WindowsForms.Markers
Imports GMap.NET.WindowsForms.ToolTips
Imports Lourdes.BackEnd.Interfaces
Imports Lourdes.BackEnd.Modelo
Imports Lourdes.BackEnd.BC
Imports Infragistics.Win.Misc
Public Class ucLogistica
  Private _EntregaActual As Entrega

  Public Event onSaved(ByVal pEntregaId As Integer)
  Public Event onCancel()


  Public Sub Save()
    Dim objEntrega As Entrega
    Dim objBcEntrega As BC_Entrega
    'Dim objLogComponent As ILogisticaComponent = Me.Parent
    Try
      objEntrega = _EntregaActual
      objBcEntrega = New BC_Entrega
      If uv.Validate.IsValid Then
        With objEntrega
          .DestApellido = txtDestApellido.Text
          .DestNombre = txtDestNombre.Text
          .DestBarrio = txtDestBarrio.Text
          .DestCalle = txtDestCalle.Text
          .DestCiudad = txtDestCiudad.Text
          .DestCodigoPostal = txtDestCP.Text
          .DestDepto = txtDestDepto.Text
          .DestEmail = txtDestEmail.Text

          If Not IsNumeric(txtDestLatitud.Text) Or Not IsNumeric(txtDestLongitud.Text) Then
            .DestLat = Nothing
            .DestLong = Nothing
          Else
            .DestLat = CDbl(txtDestLatitud.Text)
            .DestLong = CDbl(txtDestLongitud.Text)
          End If

          .DestNumeroDoc = txtDestNroDoc.Text
          .DestNumero = txtDestCalleNro.Text
          .DestPais = txtDestPais.Text
          .DestPiso = txtDestPiso.Text
          .DestProvincia = txtDestProvincia.Text
          .DestTelefono = txtDestTelefono.Text
          .DestTelefonoCel = txtDestCelular.Text
          .DestTipoDoc = txtDestTipoDoc.Text
          .Estado = 0
          .FechaCreacion = Now
          .FechaHoraEntregaPactada = txtDetFechaPactada.DateTime

        End With
        If objEntrega.EntregaId > 0 Then
          objBcEntrega.Update(objEntrega)
        Else
          objBcEntrega.AddOne(objEntrega)
        End If
        RaiseEvent onSaved(objEntrega.EntregaId)
      End If

    Catch ex As Exception
      Throw ex
    End Try
  End Sub



  Private Sub ucLogistica_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    _EntregaActual = New Entrega
    ValidacionConfigurar()
  End Sub


  Public Sub LoadLogisticaFromFactura(ByVal pFacturaId As Integer)
    Dim lstEntregas = (New BC_Entrega).getByFacturaId(pFacturaId)
    If lstEntregas.Count = 0 Then
      _EntregaActual.FacturaId = pFacturaId
    End If
    ConfiguraEntrega(lstEntregas)
  End Sub
  Private Sub ConfiguraEntrega(ByVal pLstEntrega As List(Of Entrega))
    If pLstEntrega.Count = 0 Then
      'logica para nuevo registro
      EntregaConfigurarAlta()
    ElseIf pLstEntrega.Count > 1 Then
      'seleccionar el más nuevo y utilizar ese
      EntregaCofiguraModificacion(pLstEntrega.OrderByDescending(Function(o) o.EntregaId).FirstOrDefault)
    Else
      'utiliza el único registro.
      EntregaCofiguraModificacion(pLstEntrega.FirstOrDefault)
    End If
  End Sub
  Public Sub LoadLogisticaFromEntrega(ByVal pEntregaId As Integer)
    ConfiguraEntrega((New BC_Entrega).GetByFilter(New EntregaFilter With {.EntregaId = pEntregaId}))
  End Sub

  Private Sub EntregaCofiguraModificacion(ByVal pObjEntrega As Entrega)
    'cargar controles con datos desde BD y dejar 
    'la entidad entrega como variable global.
    With pObjEntrega
      txtDestApellido.Text = .DestApellido
      txtDestBarrio.Text = .DestBarrio
      txtDestCalle.Text = .DestCalle
      txtDestCalleNro.Text = .DestNumero
      txtDestCelular.Text = .DestTelefonoCel
      txtDestCiudad.Text = .DestCiudad
      txtDestCP.Text = .DestCodigoPostal
      txtDestDepto.Text = .DestDepto
      txtDestEmail.Text = .DestEmail
      If .DestLat.HasValue Then
        txtDestLatitud.Text = .DestLat
      Else
        txtDestLatitud.Text = ""
      End If
      If .DestLong.HasValue Then
        txtDestLongitud.Text = .DestLong
      Else
        txtDestLongitud.Text = ""
      End If

      If .DestLat.HasValue And .DestLong.HasValue Then
        MapaEstablecerPosicion(.DestLat, .DestLong, 18)
      Else
        CargarMapa() 'carga coordenada por default
      End If

      txtDestNombre.Text = .DestNombre
      txtDestNroDoc.Text = .DestNumeroDoc
      txtDestPais.Text = .DestPais
      txtDestPiso.Text = .DestPiso
      txtDestProvincia.Text = .DestProvincia
      txtDestTelefono.Text = .DestTelefono
      txtDestTipoDoc.Text = .DestTipoDoc
      txtDetFechaPactada.Value = .FechaHoraEntregaPactada
    End With

    _EntregaActual = pObjEntrega

  End Sub

  Private Sub EntregaConfigurarAlta()
    'configurar los controles para el alta, y determinar si se deja una variable global o no.
    txtDestApellido.Text = ""
    txtDestBarrio.Text = ""
    txtDestCalle.Text = ""
    txtDestCalleNro.Text = ""
    txtDestCelular.Text = ""
    txtDestCiudad.Text = ""
    txtDestCP.Text = ""
    txtDestDepto.Text = ""
    txtDestEmail.Text = ""
    txtDestLatitud.Text = ""
    txtDestLongitud.Text = ""
    txtDestNombre.Text = ""
    txtDestNroDoc.Text = ""
    txtDestPais.Text = ""
    txtDestPiso.Text = ""
    txtDestProvincia.Text = ""
    txtDestTelefono.Text = ""
    txtDestTipoDoc.Text = ""
    txtDetFechaPactada.Value = Now
    CargarMapa()
  End Sub


  Private Sub ValidacionConfigurar()
    Try
      ValidationsHelper.RequestFieldValidator(txtDestApellido, uv, "Apellido", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestBarrio, uv, "Barrio", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestCalle, uv, "Calle", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestCalleNro, uv, "Calle Nro.", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestCelular, uv, "Celular", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestCiudad, uv, "Ciudad", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestCP, uv, "Código Postal", , uttmMensajes)
      'ValidationsHelper.RequestFieldValidator(txtDestDepto, uv, "Departamento", , uttmMensajes)
      ValidationsHelper.SetToolTip(txtDestDepto, uttmMensajes, "Departamento")
      'ValidationsHelper.RequestFieldValidator(txtDestEmail, uv, "Apellido", )
      ValidationsHelper.SetToolTip(txtDestEmail, uttmMensajes, "Apellido")
      'ValidationsHelper.RequestFieldValidator(txtDestLatitud, uv, "Latitud", , uttmMensajes)
      ValidationsHelper.SetToolTip(txtDestLatitud, uttmMensajes, "Latitud")
      'ValidationsHelper.RequestFieldValidator(txtDestLongitud, uv, "Longitud", , uttmMensajes)
      ValidationsHelper.SetToolTip(txtDestLongitud, uttmMensajes, "Longitud")
      ValidationsHelper.RequestFieldValidator(txtDestNombre, uv, "Nombre", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestNroDoc, uv, "Número de Documento", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestPais, uv, "País", , uttmMensajes)
      'ValidationsHelper.RequestFieldValidator(txtDestPiso, uv, "Piso", , uttmMensajes)
      ValidationsHelper.SetToolTip(txtDestPiso, uttmMensajes, "Piso")
      ValidationsHelper.RequestFieldValidator(txtDestProvincia, uv, "Provincia", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestTelefono, uv, "Teléfono", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDestTipoDoc, uv, "Tipo de Documento", , uttmMensajes)
      ValidationsHelper.RequestFieldValidator(txtDetFechaPactada, uv, "Fecha-Hora entrega pactada", "DateTime", uttmMensajes)
    Catch ex As Exception
      Throw ex
    End Try
  End Sub
  Private Sub MapaEstablecerPosicion(ByVal pLat As Double, ByVal pLong As Double, ByVal pZoom As Double)
    Dim marcaActual As GMapMarker
    Try
      map.Manager.Mode = GMap.NET.AccessMode.ServerOnly
      With map
        .Position = New PointLatLng(pLat, pLong)
        .MapType = GMap.NET.MapType.GoogleMap
        .Zoom = pZoom
        .MarkersEnabled = True
        .Manager.Language = LanguageType.Spanish


        marcaActual = New GMapMarkerGoogleRed(.Position)
        marcaActual.IsHitTestVisible = False

        Dim top As GMapOverlay = New GMapOverlay(map, "top")

        map.Overlays.Add(top)
        top.Markers.Add(marcaActual)


        With marcaActual
          .ToolTipText = "Arrastre para seleccionar el punto donde se debe realizar la entrega."
          .ToolTipMode = MarkerTooltipMode.OnMouseOver
        End With
      End With
    Catch ex As Exception
      Throw ex
    End Try
  End Sub
  Private Sub CargarMapa()
    MapaEstablecerPosicion(-31.41167, -64.181786, 11)
    'Dim marcaActual As GMapMarker
    'Try
    '  map.Manager.Mode = GMap.NET.AccessMode.ServerOnly
    '  With map
    '    .Position = New PointLatLng(-31.41167, -64.181786)
    '    .MapType = GMap.NET.MapType.GoogleMap
    '    .Zoom = 11
    '    .MarkersEnabled = True
    '    .Manager.Language = LanguageType.Spanish


    '    marcaActual = New GMapMarkerGoogleRed(.Position)
    '    marcaActual.IsHitTestVisible = False

    '    Dim top As GMapOverlay = New GMapOverlay(map, "top")

    '    map.Overlays.Add(top)
    '    top.Markers.Add(marcaActual)


    '    With marcaActual
    '      .ToolTipText = "Arrastre para seleccionar el punto donde se debe realizar la entrega."
    '      .ToolTipMode = MarkerTooltipMode.OnMouseOver
    '    End With
    '  End With
    'Catch ex As Exception
    '  Throw ex
    'End Try
  End Sub

  Private Sub btnCargarDatosCliente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCargarDatosCliente.Click
    CargarDomicilioDesdePersona()
  End Sub

  Private Sub CargarDomicilioDesdePersona()
    Dim bcPersona As BC_Persona
    Dim lstPer As List(Of Persona)

    Try
      bcPersona = New BC_Persona
      lstPer = bcPersona.getPersonaFromFactura(_EntregaActual.FacturaId)
      If lstPer.Count = 0 Then
        MsgBox("No existe ningún cliente asociado a la factura")
      Else
        txtDestPais.Text = "Argentina"
        txtDestProvincia.Text = "Cordoba"
        txtDestCiudad.Text = "Cordoba"
        LoadUIFromCliente(lstPer.FirstOrDefault)
      End If


    Catch ex As Exception
      Utils.ManejoErrores(ex)
    End Try
  End Sub

  Private Sub LoadUIFromCliente(ByVal pCliente As Persona)
    With pCliente
      txtDestApellido.Text = .Apellido
      txtDestNombre.Text = .Nombre

      If .PersonaTipoDocumento IsNot Nothing Then
        txtDestTipoDoc.Text = .PersonaTipoDocumento.NombreCorto
      Else
        txtDestTipoDoc.Text = ""
      End If

      txtDestNroDoc.Text = .NumeroDoc
      txtDestTelefono.Text = .Telefono
      txtDestCelular.Text = .TelefonoCelular
      txtDestEmail.Text = .Email

      If .PersonaDomicilio.Count > 0 Then
        Dim objDomicilioACopiar As PersonaDomicilio
        Dim lstDomPer = From pd In .PersonaDomicilio Where pd.EsPrincipal = True

        If lstDomPer.Count > 0 Then
          'utiliza el domicilio si esta marcado como principal
          objDomicilioACopiar = lstDomPer.FirstOrDefault
        Else
          'si tiene domicilio pero ninguno como principal, utiliza el primero que encuentre.
          objDomicilioACopiar = .PersonaDomicilio.FirstOrDefault
        End If

        With objDomicilioACopiar
          _EntregaActual.DestPerId = .PersonaId
          txtDestCalle.Text = .Calle
          txtDestCalleNro.Text = .Numero
          txtDestPiso.Text = .Piso
          txtDestDepto.Text = .Departamento
          txtDestBarrio.Text = .Barrio
          txtDestCP.Text = .CodigoPostal
          If .Ciudad IsNot Nothing Then
            txtDestCiudad.Text = .Ciudad.Nombre
          End If
          If .Provincia IsNot Nothing Then
            txtDestProvincia.Text = .Provincia.Nombre
          End If
          If .Pais IsNot Nothing Then
            txtDestPais.Text = .Pais.Nombre
          End If
        End With
      End If

    End With
  End Sub
  Private Sub map_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles map.MouseDown
    Dim marcaActual As GMapMarker = map.Overlays.First.Markers.First
    If e.Button = MouseButtons.Left Then
      If marcaActual.IsVisible Then
        marcaActual.Position = map.FromLocalToLatLng(e.X, e.Y)
        txtDestLatitud.Text = marcaActual.Position.Lat.ToString()
        txtDestLongitud.Text = marcaActual.Position.Lng.ToString
      End If
    End If
  End Sub

  Private Sub btnMapMas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMapMas.Click
    map.Zoom += 1
  End Sub

  Private Sub btnMapMenos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMapMenos.Click

    map.Zoom -= 1

  End Sub

  


  Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
    Save()
  End Sub

  Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
    RaiseEvent onCancel()
  End Sub

End Class


